package main

import "fmt"

/**
声明变量
*/
func variableZeroValue() {
	// go语言跟其他不一样的地方是，变量定义完了之后，每种对应的类型都是有它的“零值”（即初始值）的
	var a int
	var s string
	//fmt.Println(a, s) // 空字符串是打印不出来的
	fmt.Printf("a为%d，s为%q", a, s) // a为0，s为""
}

/**
赋初值
*/
func variableInitialValue() {
	var a, b int = 3, 4 // 多个赋初值
	var s string = "abc"
	fmt.Println(a, b, s)
}

/**
推断赋初值
*/
func variableTypeDeduction() {
	var a, b, c, s = 3, 4, true, "def" // 多个赋初值
	fmt.Println(a, b, c, s)
}

func variableShorter() {
	a, b, c, s := 3, 4, true, "def" // 多个赋初值
	b = 5
	fmt.Println(a, b, c, s)
}

// 下方定以的aa、ss、bb这些变量并不是一个全局变量，而是一个包内部的变量，我们看到go语言所有的代码都是生命在package包里面的，它没有全局变量的这样的一个说法，他们的作用域只是包内部，因此它们是安全的
//var aa = 3
//var ss = "kkk"
//var bb = true

// 简写方式（go语言可以用这个括号，来省略不断地打var）：
var (
	aa = 3
	ss = "kkk"
	bb = true
)

// 在函数外边，不能用简短写法定以变量，即不能用冒号":"这种方式去初始化变量，最简短前面也要加个var
//bb := true

func main() {
	fmt.Println("Hello world!")
	//variableZeroValue()
	//variableInitialValue()
	//variableTypeDeduction()
	variableShorter()
	fmt.Println(aa, ss, bb)
}

/**
变量定义小结：
使用var关键字
var a,b,c bool
var s1,s2 string = "hello", "world"
可放在函数内，或者放在包内
可使用var()集中定义
让编译器自动决定类型

使用:=定义变量，只能在函数内使用，尽量使用这种简短定义方式
*/
